﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET.VendedorArteCommands;
using System.Windows.Controls;
using ModeloGaleriaNET.Police;
using Newtonsoft.Json;
using ModeloGaleriaNET.VendedorArteCommands_Safe;

namespace ModeloGaleriaNET
{
    public class ModificarSubastaMessage: IMessageType
    {
        private VendedorArteCommands.VendedorArteCommands vendedor;
        private Subasta subasta;
        private VendedorArteCommands.AuthInfo auth;
        private DateTime lastDate;
        private int lastMpp;
        private AvalonDock.DockableContent doc;
        private int usuarioId;
        private GandalfService policia;

        public ModificarSubastaMessage(Subasta s, AvalonDock.DockableContent d, int uId)
        {
            policia = new GandalfService();
            doc = d;
            subasta = s;
            lastMpp = s.MaximoPujasPostor;
            lastDate = s.FechaLimite;
            vendedor = new VendedorArteCommands.VendedorArteCommands();
            vendedor.Timeout = (int)ServerConnData.Instance.TimeOut*1000;
            auth = new AuthInfo();
            auth.pseudonimo = ServerConnData.Instance.User;
            auth.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
            this.usuarioId = uId;
        }

        public int UsuarioId
        {
            get { return usuarioId; }
        }

        public Subasta Subasta
        {
            get { return subasta; }
        }

        public DateTime LastDateFin
        {
            get { return lastDate; }
        }

        public int LastMaxPujas
        {
            get { return lastMpp; }
        }

        public int Execute()
        {
            authInfo authPolice;
            getTicketResponse ticketResponse;
            AESCripto aes;
            dynamic objeto;
            string json;
            byte[] encriptado;
            VendedorArteCommandsService vendedorSafe;
            ticketEncryptedRequest request;
            Dictionary<string, object> diccionarioFin;

            if (ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 || ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 3)
            {
                diccionarioFin = new Dictionary<string,object>();
                diccionarioFin.Add("year", subasta.FechaLimite.Year);
                diccionarioFin.Add("month", subasta.FechaLimite.Month - 1);
                diccionarioFin.Add("dayOfMonth", subasta.FechaLimite.Day);
                diccionarioFin.Add("hourOfDay", subasta.FechaLimite.Hour);
                diccionarioFin.Add("minute", subasta.FechaLimite.Minute);
                diccionarioFin.Add("second", subasta.FechaLimite.Second);
                diccionarioFin.Add("zone", "GMT");

                objeto = new
                {
                    referencia = Convert.ToInt64(subasta.ReferenciaExterna),
                    finaliza = diccionarioFin,
                    mpp = subasta.MaximoPujasPostor,
                };
                json = JsonConvert.SerializeObject(objeto);
                // Fin serializar cosas en JSON

                policia.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService :
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService_SSL;
                policia.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                authPolice = new authInfo();
                authPolice.pseudonimo = ServerConnData.Instance.User;
                authPolice.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
                ticketResponse = policia.getTicket(authPolice);
        
                // Crear mensaje encriptado con el JSON y enviar
                aes = new AESCripto(ticketResponse.secretKey);
                encriptado = aes.EncryptStringToBytes(json);

                vendedorSafe = new VendedorArteCommandsService();
                vendedorSafe.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService :
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService_SSL;
                vendedorSafe.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                request = new ticketEncryptedRequest();
                request.message = encriptado;
                request.ticketId = ticketResponse.ticketId;
                vendedorSafe.actualizarSubastaEncrypted(request);
            }
            else
            {
                vendedor.Url = Properties.Settings.Default.Seguridad == 0 ?
                    Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands :
                    Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands_SSL;
                vendedor.actualizar(auth, Convert.ToInt64(subasta.ReferenciaExterna), true, subasta.FechaLimite, true, subasta.MaximoPujasPostor, true);
            }
            return -1;
        }

        delegate void AddDataGridColumn();

        public void printInitialMessage()
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tModificando la subasta con referencia local " + subasta.Id + "...",
                DataGridMessage.TIPO_MENSAJE.INFO);
        }

        public void printErrorMessage()
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tHa ocurrido un error al modificar la subasta con referencia local",
                DataGridMessage.TIPO_MENSAJE.WARNING);
        }

        public void printLastErrorMessage()
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tNo se ha podido modificar la subasta con referencia "
                    + subasta.Id + " después de 3 intentos. Se han desecho los cambios en local",
                DataGridMessage.TIPO_MENSAJE.ERROR);
        }

        public void printSuccessMessage()
        {
            Utilities.WriteMessageOnGrid(doc, "[Local]\tLa subasta con referencia "
                    + subasta.Id + " se ha modificado con éxito",
                DataGridMessage.TIPO_MENSAJE.INFO);
        }
    }
}
